《爱上潘大师》系列-你还记得那年的DataFrame吗
2020,努力做一个无可替代的人!
作者 | 小一
全文共2327字,阅读全文需9分钟
写在前面的话
如果你还记得那年大明湖畔的xiaoyige,那你就应该来看看这篇文章
我们学的是技术,小一我写的可是技术文章,哪来那么多情啊爱啊的
今天的内容很重要的!
先复习一下前面的文章:
可能有的同学不理解复习的意义,我简单说一下:
我写系列文章的时候都会先列好整个系列的大纲,甚至有时候几篇文章是同一天肝出来的。
这就造成有时候这一篇文章的概念会及其依赖上一篇文章,所以呢,花个两三分钟复习一下上一篇,你会更好理解这篇文章。
正文
今天介绍潘大师的另一种数据结构:Dataframe,一个表格型的数据结构。
对于Series 我们只用了一小节介绍,而Dataframe 可能会用三节内容,孰轻孰重应该都清楚吧
学习DataFrame,小一建议你最好和Excel表格联系起来
Excel 表格有行索引、列索引,有数据块,有数据的查找、替换、去重,有数据的透视,汇总,有不同表的数据匹配等等这些。
DataFrame 的初衷就是为了解决这些问题,简洁、易用的功能也是作者最初的愿景
所以 ,后面的系列文章,如果你对某个概念不是很理解,想一想 Excel 中是怎么表述的
创建 DataFrame
先来一个DataFrame 介绍三连
DataFrame 有行(索引)、有列(索引),可以看做是由一个个的Series 组成的字典。
DataFrame 每列可以是不同的值类型(数值、字符串、布尔值)
DataFrame 中的数据是以一个或多个二维块存放的
那DataFrame 都有哪些创建方式?
和NumPy 一样,DataFrame 创建方式也有很多种
通过二维ndarray 创建 通过字典创建 通过列表创建 通过另一个DataFrame 创建
下面简单介绍一下常用的,剩下的同学们自己拓展
通过二维ndarray创建DataFrame
创建一个二维的ndarray 数组,该数组即DataFrame 的数据集
# 通过二维ndarray创建DataFrame
arr_data = np.arange(12).reshape(3, 4)
df_data1 = pd.DataFrame(arr_data)
# 输出
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
结果DataFrame 会自动加上行索引和列索引,和Series 的创建一样
那应该怎么显示声明行、列索引?
也和Series 的创建一样,在创建的时候手动指定就行
# 通过二维ndarray创建DataFrame
columns = ['one', 'two', 'three', 'four']
index = ['a', 'b', 'c']
# 显示指定行、列索引
df_data1 = pd.DataFrame(arr_data, columns=columns, index=index)
# 输出
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
通过字典创建DataFrame
数组、元祖 、列表 组成的字典
字典组成的字典(嵌套)
Series 组成的字典
只要数据是字典格式,就可以做数据集
字典的key作为DataFrame的列索引
# 通过字典创建DataFrame
dict_data = {
'name': ['xiaoyi', 'xiaosi', 'xiaoqi'],
'age': [11, 14, 17],
'score': [95.5, 94.5, 97]
}
df_data2 = pd.DataFrame(dict_data)
# 输出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
列索引是字典的 key 值,行索引自动填充
当然字典里面的值数据类型你可以尽情变化,Series、元祖、列表等都是可以的
通过列表创建DataFrame
同样的,这里的列表类型也不止一种:
字典组成的列表
Series 组成的列表
# 通过列表创建DataFrame
list_data = [
{'one': 1, 'two': 2},
{'one': 1, 'two': 2, 'three': 4}
]
df_data3 = pd.DataFrame(list_data)
# 输出
one two three
0 1 2 NaN
1 1 2 4.0
主要就是这三种创建方式,有些书上写的过于复杂,让人眼花缭乱
万变不离其宗,核心就是这三种
至于第四种通过其他DataFrame创建,就不多说了吧?
经常读我文章的同学要是会了前三种,还不会第四种?
不妨看一下NumPy 的数组创建?顺便反思一下?
索引对象
DataFrame 已经创建好了,但是索引还不太明白,是和Series的一样吗?
能想到Series,说明你差不多都知道是怎么回事了
构建Series 或者DataFrame 时,所用到的任何数据的标签都会被转换成Index对象
Index 对象是不可修改的,这样可以保证多个数据结构之间的安全共享
毕竟人家可是索引,你索引要是都一样了,那到底应该指向谁就说不清了
我们可以使用重新索引的方法 reindex
reindex 的用处相当大,我详细介绍一下参数
reindex(index, method, fille_value, limit, level, copy)
参数 | 说明 |
---|---|
index | 用作索引的新序列 |
method | 插值(填充)方式,包括:ffill(前向填充值)、bfill(后向填充值) |
fill_value | 在重新索引的过程中,需要引入缺失值时使用的替代值 |
limit | 前向或后向填充时的最大填充量 |
在DataFrame中,存在行、列索引,不同于Series 中只有单一索引。
所以DataFrame中 reindex 可以行、列索引都修改
先看单一索引
# 创建 Series
series_data = pd.Series([1, 2, 4, 5], index=['a', 'b', 'c', 'e'])
# 输出
a 1
b 2
c 4
e 5
dtype: int64
# 重新索引
series_data = series_data.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=-1)
# 输出
a 1
b 2
c 4
d -1
e 5
dtype: int64
reindex 会根据新索引进行重排,如果某个索引值不存在,则使用 fille_value 的值进行填充
还记得前面说的DataFrame 中行、列索引分别是什么吗?
行索引:index (想象成Excel 中的序号)
列索引:columns (想象成Excel 中的列名)
df_data2
# 输出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
# 行、列重新索引
columns = ['name', 'age', 'score', 'score2']
index = [0, 1, 2, 3]
df_data2 = df_data2.reindex(index=index, columns=columns)
# 输出
name age score score2
0 xiaoyi 11.0 95.5 NaN
1 xiaosi 14.0 94.5 NaN
2 xiaoqi 17.0 97.0 NaN
3 NaN NaN NaN NaN
对行、列都进行重新索引,索引值不存在的会用空值填充
索引很重要,是Pandas 数据模型的重要部分,但是我们了解上面的内容就够了,也没必要去深究它。
总结一下:
今天主要介绍了DataFrame 的创建和索引的相关操作。
创建方法也是一如既往的多,不过不要慌,真正用起来的时候基本都是从文件中读数据,就一个方法。
索引这一块不要搞混行索引、列索引。
对于索引的一些方法最好是掌握,我写出来的都是常用的,不是常用的我也懒得写,你要是还纠结建议你去查API 文档细品
写在后面的话
每天进步一点点,学习不就是这么来的吗?
写这篇文章的时候,我接到了一个关系很好的朋友的消息。
他的考研成绩公布了,边工作边复习的他,考研历程是我认识的人中最艰难的、最辛苦的。
等他有空,我去取取经,投稿部分应该会有新文章,期待一下
碎碎念一下
上一节碎碎念太多,一下没控制住自己 算算时间,去年十二月份定下的小目标:每周两篇原创文 ,除了春节期间,应该都实现了。 加油加油
好巧啊,你也读到这了!
点个
在看
让我看到你